package main

import (
	"fmt"
	"log"
	"os"

	"go-file-perception-model/internal/config"
)

func main() {
	fmt.Println("=== 配置保存功能修复测试 ===")

	// 备份原始配置文件
	originalConfigPath := "config/config.yaml"
	backupConfigPath := "config/config.yaml.backup"
	
	if _, err := os.Stat(originalConfigPath); err == nil {
		if err := copyFile(originalConfigPath, backupConfigPath); err != nil {
			log.Fatalf("Failed to backup config: %v", err)
		}
		fmt.Println("✅ 原始配置文件已备份")
	}

	// 加载当前配置
	cfg, err := config.LoadConfig()
	if err != nil {
		log.Fatalf("Failed to load config: %v", err)
	}
	fmt.Println("✅ 配置加载成功")

	// 验证加载的配置
	fmt.Printf("  BGE服务API密钥: %s\n", cfg.BGEService.APIKey)
	fmt.Printf("  向量数据库端口: %d\n", cfg.VectorDB.Port)
	fmt.Printf("  服务器端口: %d\n", cfg.Server.Port)
	fmt.Printf("  索引目录: %v\n", cfg.FileIndex.IndexDirectories)

	// 修改file_index配置
	originalDirs := make([]string, len(cfg.FileIndex.IndexDirectories))
	copy(originalDirs, cfg.FileIndex.IndexDirectories)
	
	cfg.FileIndex.IndexDirectories = []string{"./new_test_dir1", "./new_test_dir2"}
	cfg.FileIndex.ChunkSize = 1500
	cfg.FileIndex.SemanticChunking = false

	fmt.Println("\n=== 测试配置保存 ===")
	fmt.Println("修改索引目录和分块大小...")

	// 保存配置（这里应该只更新file_index部分）
	if err := cfg.FileIndex.Save(); err != nil {
		log.Fatalf("Failed to save config: %v", err)
	}
	fmt.Println("✅ 配置保存成功")

	// 重新加载配置验证
	cfg2, err := config.LoadConfig()
	if err != nil {
		log.Fatalf("Failed to reload config: %v", err)
	}
	fmt.Println("✅ 配置重新加载成功")

	// 验证配置是否正确保存
	fmt.Println("\n=== 验证配置保存结果 ===")
	
	// 检查file_index是否更新
	if len(cfg2.FileIndex.IndexDirectories) == 2 && 
	   cfg2.FileIndex.IndexDirectories[0] == "./new_test_dir1" &&
	   cfg2.FileIndex.IndexDirectories[1] == "./new_test_dir2" {
		fmt.Println("✅ 索引目录更新正确")
	} else {
		fmt.Printf("❌ 索引目录更新错误: %v\n", cfg2.FileIndex.IndexDirectories)
	}

	if cfg2.FileIndex.ChunkSize == 1500 {
		fmt.Println("✅ 分块大小更新正确")
	} else {
		fmt.Printf("❌ 分块大小更新错误: %d\n", cfg2.FileIndex.ChunkSize)
	}

	if !cfg2.FileIndex.SemanticChunking {
		fmt.Println("✅ 语义分块设置更新正确")
	} else {
		fmt.Println("❌ 语义分块设置更新错误")
	}

	// 检查其他配置是否保留
	if cfg2.BGEService.APIKey == "bge-service-secret-key-2023" {
		fmt.Println("✅ BGE服务配置保留正确")
	} else {
		fmt.Printf("❌ BGE服务配置丢失: %s\n", cfg2.BGEService.APIKey)
	}

	if cfg2.VectorDB.Port == 6333 {
		fmt.Println("✅ 向量数据库配置保留正确")
	} else {
		fmt.Printf("❌ 向量数据库配置丢失: %d\n", cfg2.VectorDB.Port)
	}

	if cfg2.Server.Port == 8080 {
		fmt.Println("✅ 服务器配置保留正确")
	} else {
		fmt.Printf("❌ 服务器配置丢失: %d\n", cfg2.Server.Port)
	}

	if cfg2.Monitoring.ScanInterval == 300 {
		fmt.Println("✅ 监控配置保留正确")
	} else {
		fmt.Printf("❌ 监控配置丢失: %d\n", cfg2.Monitoring.ScanInterval)
	}

	// 恢复原始配置文件
	if _, err := os.Stat(backupConfigPath); err == nil {
		if err := copyFile(backupConfigPath, originalConfigPath); err != nil {
			log.Printf("Warning: Failed to restore config: %v", err)
		} else {
			fmt.Println("\n✅ 原始配置文件已恢复")
		}
		os.Remove(backupConfigPath)
	}

	fmt.Println("\n=== 测试完成 ===")
	fmt.Println("配置保存功能修复验证完成！")
}

// copyFile 复制文件
func copyFile(src, dst string) error {
	data, err := os.ReadFile(src)
	if err != nil {
		return err
	}
	return os.WriteFile(dst, data, 0644)
}